﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Data;
using System.Windows.Media.Animation;

namespace System.Windows.Media.Media3D10
{
    /// <summary>
    /// Fournit la prise en charge de la transformation généralisée pour les objets 3D. 
    /// </summary>
    public abstract class GeneralTransform3D10 : Animatable
    {
        #region Public Properties
        /// <summary>
        /// Obtient la transformation inverse de cet objet, si possible.
        /// </summary>
        public abstract GeneralTransform3D10 Inverse { get; }
        #endregion

        #region Public Methods
        /// <summary>
        /// Crée un clone modifiable de ce <see cref="GeneralTransform3D10"/>, en créant des copies complètes des valeurs de cet objet.
        /// Lors de la copie de propriétés de dépendance, cette méthode copie les références de ressources et les liaisons de données (même si elles ne peuvent plus être résolues), mais pas les animations ni leurs valeurs actuelles.
        /// </summary>
        /// <returns>
        /// Clone modifiable de l'objet actuel.
        /// La valeur de la propriété <see cref="Freezable.IsFrozen"/> de l'objet cloné est false, même si la valeur de la propriété <see cref="Freezable.IsFrozen"/> de la source est true.
        /// </returns>
        public new GeneralTransform3D10 Clone()
        {
            return base.Clone() as GeneralTransform3D10;
        }

        /// <summary>
        /// Crée un clone modifiable de ce <see cref="GeneralTransform3D10"/>, en créant des copies complètes des valeurs actuelles de cet objet.
        /// Contrairement à leurs valeurs actuelles, les références de ressources, les liaisons de données et les animations ne sont pas copiées.
        /// </summary>
        /// <returns>
        /// Clone modifiable de l'objet actuel.
        /// La valeur de la propriété <see cref="Freezable.IsFrozen"/> de l'objet cloné est false, même si la valeur de la propriété <see cref="Freezable.IsFrozen"/> de la source est true.
        /// </returns>
        public new GeneralTransform3D10 CloneCurrentValue()
        {
            return base.CloneCurrentValue() as GeneralTransform3D10;
        }

        /// <summary>
        /// Transforme le <see cref="SlimDX.Vector3"/> spécifié. 
        /// </summary>
        /// <param name="vector"><see cref="SlimDX.Vector3"/> à transformer.</param>
        /// <returns><see cref="SlimDX.Vector3"/> transformé.</returns>
        [System.ComponentModel.TypeConverter(typeof(Vector3TypeConverter))]
        public SlimDX.Vector3 Transform(SlimDX.Vector3 vector)
        {
            SlimDX.Vector3 result;
            if (!TryTransform(vector, out result))
                throw new InvalidOperationException("Transform cannot be opered");
            return result;
        }

        /// <summary>
        /// En cas de substitution dans une classe dérivée, tente de transformer le <see cref="SlimDX.Vector3"/> spécifié et retourne une valeur qui indique si la transformation a réussi.
        /// </summary>
        /// <param name="inVector"><see cref="SlimDX.Vector3"/> à transformer.</param>
        /// <param name="result">Résultat de la transformation de <paramref name="inVector"/>.</param>
        /// <returns>true si <paramref name="inVector"/> a été transformé ; sinon, false.</returns>
        public abstract bool TryTransform(SlimDX.Vector3 inVector, out SlimDX.Vector3 result);
        #endregion
    }
}
